/* mcrypto.h
**
** Copyright (c) 2007, Meadhbh S. Hamrick
** All rights reserved.
** 
** Redistribution  and  use  in  source  and  binary  forms,  with  or  without
** modification, are permitted provided that the following conditions are met:
** 
**  * Redistributions of  source code must  retain the above  copyright notice,
**    this list of conditions and the following disclaimer.
** 
**  * Redistributions in binary form must reproduce the above copyright notice,
**    this list of conditions and the following disclaimer in the documentation
**    and/or other materials provided with the distribution.
** 
**  * Neither the  name of  Project Meadhbh  nor the names of  its contributors
**    may be used  to endorse  or promote  products derived from this  software
**    without specific prior written permission.
** 
** THIS SOFTWARE IS PROVIDED BY  THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
** AND ANY  EXPRESS OR IMPLIED WARRANTIES,  INCLUDING, BUT NOT  LIMITED TO, THE
** IMPLIED WARRANTIES  OF MERCHANTABILITY AND FITNESS FOR  A PARTICULAR PURPOSE
** ARE DISCLAIMED.  IN NO  EVENT SHALL THE  COPYRIGHT OWNER OR  CONTRIBUTORS BE
** LIABLE  FOR  ANY  DIRECT,   INDIRECT,  INCIDENTAL,  SPECIAL,  EXEMPLARY,  OR
** CONSEQUENTIAL  DAMAGES  (INCLUDING,  BUT  NOT  LIMITED  TO,  PROCUREMENT  OF
** SUBSTITUTE GOODS  OR SERVICES;  LOSS OF USE,  DATA, OR PROFITS;  OR BUSINESS
** INTERRUPTION)  HOWEVER CAUSED  AND ON  ANY THEORY  OF LIABILITY,  WHETHER IN
** CONTRACT,  STRICT LIABILITY,  OR  TORT (INCLUDING  NEGLIGENCE OR  OTHERWISE)
** ARISING IN ANY WAY  OUT OF THE USE OF THIS SOFTWARE,  EVEN IF ADVISED OF THE
** POSSIBILITY OF SUCH DAMAGE.
** 
** $Id: mcrypto.h 81 2010-08-17 19:23:57Z OhMeadhbh@gmail.com $
*/

/*! \mainpage mcrypto - yet another crypto package
 *
 * \section intro_sec Introduction
 *
 * "mcrypto" is a basic implementation of various cryptographic algorithms.
 * It's primary intent is to provide high quality, readable open source
 * implementations of less common algorithms in C.
 *
 * \section install_sec Installation
 *
 * \subsection step1 Step 1: Opening the box
 *
 * etc...
 */

/* Macro Definitions */
#ifndef _H_MCRYPTO
#define _H_MCRYPTO

/* File Inclusions */
#include "mutil.h"
#include "mcrypto/md2.h"
#include "mcrypto/md4.h"
#include "mcrypto/md5.h"
#include "mcrypto/sha1.h"
#include "mcrypto/sha224.h"
#include "mcrypto/sha256.h"
#include "mcrypto/sha384.h"
#include "mcrypto/sha512.h"

/* Typedefs, Structs, Enums, Unions */

typedef enum {
  MC_E_NOERR = 0,
  MC_E_UNKNOWN,
  MC_E_UNIMPLEMENTED,
  MC_E_NULL,
  MC_E_BADPARAM
} tMCErr;

typedef enum {
  MC_MIC_A_MD2,
  MC_MIC_A_MD4,
  MC_MIC_A_MD5,
  MC_MIC_A_SHA1,
  MC_MIC_A_SHA224,
  MC_MIC_A_SHA256,
  MC_MIC_A_SHA384,
  MC_MIC_A_SHA512
} tMCAlgorithm;

typedef struct {
  uint32_t size;
  tMCAlgorithm algo;
  uint8_t         content[1];
} tMCContext;

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

  /* Function Prototypes */

  tMCErr mc_mic_new( tMCContext **context, tMCAlgorithm algo );
  tMCErr mc_mic_new_from_ber( tMCContext **context, uint8_t *ber );
  tMCErr mc_mic_new_from_string( tMCContext **context, uint8_t *string, uint32_t length );
  tMCErr mc_mic_new_from_oid( tMCContext **context, uint8_t *oid, uint32_t length );
  tMCErr mc_mic_clone( tMCContext **new_context, tMCContext *old_context );
  tMCErr mc_mic_destroy( tMCContext *context );
  tMCErr mc_mic_clear( tMCContext *context );
  tMCErr mc_mic_context_size( tMCAlgorithm algo, uint32_t *size );
  tMCErr mc_mic_output_size( tMCContext *context, uint32_t *size );
  tMCErr mc_mic_output_size_from_algorithm( tMCAlgorithm algo, uint32_t *size );
  tMCErr mc_mic_algorithm_from_ber( tMCAlgorithm *algo, uint8_t *ber );
  tMCErr mc_mic_algorithm_from_string( tMCAlgorithm *algo, uint8_t *string, uint32_t length );
  tMCErr mc_mic_algorithm_from_oid( tMCAlgorithm *algo, uint8_t *oid, uint32_t length );
  tMCErr mc_mic_initialize( tMCContext *context );
  tMCErr mc_mic_update( tMCContext *context, uint8_t *data, uint32_t length );
  tMCErr mc_mic_digest( tMCContext *context, uint8_t *digest );

  /* Global Variable Declarations */

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* _H_MCRYPTO */
